#include "StdAfx.h"
#include "PhoneTone.h"
#include <MMSystem.h>

#define SIP_RESPONSE_RINGING            180
#define SIP_RESPONSE_SESSION_PROGRESS   183

CPhoneTone::CPhoneTone(void)
{
	m_bActivateRingTone = FALSE;
	m_bActivateDialTone = FALSE;

	m_bPlayingRingTone = FALSE;
	m_bPlayingDialTone = FALSE;
}

CPhoneTone::~CPhoneTone(void)
{
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void CPhoneTone::ActivateRingTone(BOOL bActivate)
{
	m_bActivateRingTone = bActivate;
}

void CPhoneTone::ActivateDialTone(BOOL bActivate)
{
	m_bActivateDialTone = bActivate;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void CPhoneTone::StartRingTone()
{
	if(m_bActivateRingTone == FALSE) return;
    if(m_bPlayingRingTone) return;
           
    PlaySound("ring.wav", 0, SND_ASYNC | SND_FILENAME | SND_LOOP | SND_NODEFAULT);
    m_bPlayingRingTone = true;
}

void CPhoneTone::StopRingTone()
{
	if(!m_bPlayingRingTone) return;
            
	PlaySound(NULL, 0, 0);
	m_bPlayingRingTone = false;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void CPhoneTone::StartDialTone()
{
	if(m_bActivateDialTone == FALSE) return;
	if(m_bPlayingDialTone) return;
            
	PlaySound("ring.wav", 0, SND_ASYNC | SND_FILENAME | SND_LOOP | SND_NODEFAULT);
	m_bPlayingDialTone = true;
}

void CPhoneTone::StopDialTone()
{
	if(!m_bPlayingDialTone) return;     
   
	PlaySound(NULL, 0, 0); 
	m_bPlayingDialTone = false;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void CPhoneTone::OnProvisionalResponse(int nLineNo, int nStatusCode, CString sReasonPhrase)
{
	if(nStatusCode == SIP_RESPONSE_RINGING)
       StartDialTone();
            
    else if(nStatusCode == SIP_RESPONSE_SESSION_PROGRESS)
        StopDialTone();
}

void CPhoneTone::OnFailureResponse(int nLineNo, int nStatusCode, CString sReasonPhrase)
{
	StopDialTone();
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void CPhoneTone::OnIncomingCallRingingStart(LPCTSTR sCallId)
{   
	StartRingTone();
}

void CPhoneTone::OnIncomingCallRingingStop(LPCTSTR sCallId)
{
	StopRingTone();
}

void CPhoneTone::OnIncomingCallRejected()
{
	StopRingTone();
}

void CPhoneTone::OnIncomingCallAccepted()
{
	StopRingTone();
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

void CPhoneTone::OnFailToConnect()
{
	StopDialTone();
}

void CPhoneTone::OnLineConnected() 
{
	StopDialTone();
}

void CPhoneTone::OnLineDisconnected() 
{
	StopDialTone();
}
